"""
配置管理模块，用于管理系统配置
"""
import os
import sys
import json
import configparser
from typing import Any, Dict, List, Union, Optional

from src.utils.logger import logger


class ConfigManager:
    """配置管理类，用于管理系统配置"""
    
    def __init__(self):
        """初始化配置管理器"""
        # 确定配置文件路径
        # 优先使用可执行文件所在目录下的配置文件
        if getattr(sys, 'frozen', False):
            # 如果是打包后的可执行文件
            base_dir = os.path.dirname(sys.executable)
            self.config_dir = os.path.join(base_dir, "config")
            self.config_file = os.path.join(self.config_dir, "config.ini")
            logger.debug(f"使用可执行文件目录下的配置文件: {self.config_file}")
        else:
            # 如果是开发环境
            self.config_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "config")
            self.config_file = os.path.join(self.config_dir, "config.ini")
            logger.debug(f"使用开发环境下的配置文件: {self.config_file}")
        
        # 创建配置解析器
        self.config = configparser.ConfigParser()
        
        # 加载配置文件
        self.load()
    
    def load(self) -> bool:
        """
        加载配置文件
        
        Returns:
            bool: 是否成功加载
        """
        try:
            # 确保配置目录存在
            os.makedirs(self.config_dir, exist_ok=True)
            
            # 如果配置文件不存在，创建默认配置
            if not os.path.exists(self.config_file):
                logger.warning(f"配置文件不存在，将创建默认配置: {self.config_file}")
                return self.create_default_config()
            
            # 读取配置文件
            self.config.read(self.config_file, encoding="utf-8")
            logger.debug(f"配置文件加载成功: {self.config_file}")
            return True
        except Exception as e:
            logger.error(f"加载配置文件异常: {e}")
            return False
    
    def save(self) -> bool:
        """
        保存配置文件
        
        Returns:
            bool: 是否成功保存
        """
        try:
            # 确保配置目录存在
            os.makedirs(self.config_dir, exist_ok=True)
            
            # 写入配置文件
            with open(self.config_file, "w", encoding="utf-8") as f:
                self.config.write(f)
            
            logger.debug(f"配置文件保存成功: {self.config_file}")
            return True
        except Exception as e:
            logger.error(f"保存配置文件异常: {e}")
            return False
    
    def create_default_config(self) -> bool:
        """
        创建默认配置
        
        Returns:
            bool: 是否成功创建
        """
        try:
            # 确保配置目录存在
            os.makedirs(self.config_dir, exist_ok=True)
            
            # 设置默认配置
            # 数据库配置
            if not self.config.has_section("database"):
                self.config.add_section("database")
            self.config.set("database", "host", "localhost")
            self.config.set("database", "port", "3306")
            self.config.set("database", "user", "root")
            self.config.set("database", "password", "1234!@#$")
            self.config.set("database", "database", "xt_dust")
            self.config.set("database", "table_name", "t_warning_info")
            self.config.set("database", "charset", "utf8mb4")
            
            # 微信配置
            if not self.config.has_section("wechat"):
                self.config.add_section("wechat")
            self.config.set("wechat", "contacts", json.dumps(["文件传输助手"]))
            
            # 调度器配置
            if not self.config.has_section("scheduler"):
                self.config.add_section("scheduler")
            self.config.set("scheduler", "check_minutes", "0,15,30,45")
            
            # 系统配置
            if not self.config.has_section("system"):
                self.config.add_section("system")
            self.config.set("system", "log_file", "logs/wechat_alarm.log")
            
            # 保存配置文件
            return self.save()
        except Exception as e:
            logger.error(f"创建默认配置异常: {e}")
            return False
    
    def get_value(self, section: str, option: str, default: Any = None) -> Any:
        """
        获取配置值
        
        Args:
            section: 配置节
            option: 配置项
            default: 默认值
        
        Returns:
            Any: 配置值
        """
        try:
            if not self.config.has_section(section):
                return default
            
            if not self.config.has_option(section, option):
                return default
            
            value = self.config.get(section, option)
            
            # 尝试解析JSON
            try:
                return json.loads(value)
            except:
                return value
        except Exception as e:
            logger.error(f"获取配置值异常: {e}")
            return default
    
    def set_value(self, section: str, option: str, value: Any) -> bool:
        """
        设置配置值
        
        Args:
            section: 配置节
            option: 配置项
            value: 配置值
        
        Returns:
            bool: 是否成功设置
        """
        try:
            # 确保配置节存在
            if not self.config.has_section(section):
                self.config.add_section(section)
            
            # 如果值是列表、字典等复杂类型，转换为JSON字符串
            if isinstance(value, (list, dict, bool, int, float)):
                value = json.dumps(value)
            
            # 设置配置值
            self.config.set(section, option, str(value))
            return True
        except Exception as e:
            logger.error(f"设置配置值异常: {e}")
            return False
    
    def get_database_config(self) -> Dict[str, Any]:
        """
        获取数据库配置
        
        Returns:
            Dict[str, Any]: 数据库配置
        """
        return {
            "host": self.get_value("database", "host", "localhost"),
            "port": int(self.get_value("database", "port", 3306)),
            "user": self.get_value("database", "user", "root"),
            "password": self.get_value("database", "password", ""),
            "database": self.get_value("database", "database", ""),
            "table_name": self.get_value("database", "table_name", ""),
            "charset": self.get_value("database", "charset", "utf8mb4")
        }
    
    def get_wechat_config(self) -> Dict[str, Any]:
        """
        获取微信配置
        
        Returns:
            Dict[str, Any]: 微信配置
        """
        return {
            "contacts": self.get_value("wechat", "contacts", [])
        }
    
    def get_scheduler_config(self) -> Dict[str, Any]:
        """
        获取调度器配置
        
        Returns:
            Dict[str, Any]: 调度器配置
        """
        return {
            "check_minutes": self.get_value("scheduler", "check_minutes", "0,15,30,45")
        }
    
    def get_system_config(self) -> Dict[str, Any]:
        """
        获取系统配置
        
        Returns:
            Dict[str, Any]: 系统配置
        """
        return {
            "log_file": self.get_value("system", "log_file", "logs/wechat_alarm.log")
        }


# 创建全局配置管理器实例
config_manager = ConfigManager() 